import winston from 'winston';
import { envConfig } from './environment';

// 日志级别配置
const levels = {
  error: 0, // 最高级别，用于记录错误
  warn: 1,  // 警告级别，用于记录警告信息
  info: 2,  // 信息级别，用于记录一般信息
  http: 3,  // HTTP 请求级别，用于记录 HTTP 请求信息
  verbose: 4, // 详细级别，用于记录详细信息
  debug: 5,  // 调试级别，用于记录调试信息
  silly: 6   // 最低级别，用于记录最详细的信息
};

// 根据环境设置日志级别
const level = () => {
  const env = envConfig.nodeEnv || 'development';
  const isDevelopment = env === 'development';
  return isDevelopment ? 'debug' : envConfig.logLevel || 'warn';
};

// 日志格式配置
const format = winston.format.combine(
  winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }),
  winston.format.errors({ stack: true }),
  winston.format.json()
);

// 开发环境格式（更易读）
const developmentFormat = winston.format.combine(
  winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }),
  winston.format.errors({ stack: true }),
  winston.format.uncolorize(),
  winston.format.printf(
    (info) => `${info.timestamp} ${info.level}: ${info.message}`
  )
);

// 传输配置
const transports = [
  // 控制台输出
  new winston.transports.Console({
    format: envConfig.nodeEnv === 'development' ? developmentFormat : format
  }),

  // 错误日志文件
  new winston.transports.File({
    filename: 'logs/error.log',
    level: 'error',
    format: format
  }),

  // 所有日志文件
  new winston.transports.File({
    filename: 'logs/all.log',
    format: format
  })
];

// 创建 logger 实例
const logger = winston.createLogger({
  level: level(),
  levels,
  format: envConfig.nodeEnv === 'development' ? developmentFormat : format,
  transports,
  // 不退出未捕获的异常
  exitOnError: false
});

// 创建 HTTP 请求专用的 logger
const httpLogger = winston.createLogger({
  level: 'http',
  levels,
  format: winston.format.combine(
    winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }),
    winston.format.json()
  ),
  transports: [
    new winston.transports.File({
      filename: 'logs/http.log',
      level: 'http'
    })
  ]
});

// 日志工具函数
export const log = {
  // 错误日志
  error: (message: string, meta?: any) => {
    logger.error(message, meta);
  },

  // 警告日志
  warn: (message: string, meta?: any) => {
    logger.warn(message, meta);
  },

  // 信息日志
  info: (message: string, meta?: any) => {
    logger.info(message, meta);
  },

  // HTTP 请求日志
  http: (message: string, meta?: any) => {
    httpLogger.http(message, meta);
  },

  // 详细日志
  verbose: (message: string, meta?: any) => {
    logger.verbose(message, meta);
  },

  // 调试日志
  debug: (message: string, meta?: any) => {
    logger.debug(message, meta);
  },

  // 数据库操作日志
  database: (operation: string, collection: string, meta?: any) => {
    logger.info(`DB ${operation} on ${collection}`, meta);
  }
};

// 请求日志中间件
export const requestLogger = (ctx: any, responseTime: number) => {
  const meta = {
    method: ctx.method,
    url: ctx.url,
    status: ctx.status,
    responseTime: `${responseTime}ms`,
    userAgent: ctx.headers['user-agent'],
    ip: ctx.ip
  };

  if (ctx.status >= 400) {
    log.http('HTTP Request Error', meta);
  } else {
    log.http('HTTP Request', meta);
  }
};

// 错误日志中间件
export const errorLogger = (error: any, ctx?: any) => {
  const meta = {
    error: error.message,
    stack: error.stack,
    ...(ctx && {
      method: ctx.method,
      url: ctx.url,
      status: ctx.status,
      userAgent: ctx.headers['user-agent'],
      ip: ctx.ip
    })
  };

  log.error('Application Error', meta);
};

export default logger;